﻿#region COPYRIGHT
//--------------------------------------------------------------------------------
// <copyright file="interp.cs" company="starLiGHT Entertainment Studios">
//    Copyright (c) 2007, 2008, 2009, 2010, 2011
//       Roland Rosenkranz (Glatzemann@email.de)
//
//    Based on libnoise by Jason Bevins
//      Copyright (C) 2003, 2004 Jason Bevins (licensed under LGPL)
// </copyright>
// <license>
//   This file is part of starLiGHT.Noise.
//
//   starLiGHT.Noise is free software: you can redistribute it and/or modify
//   it under the terms of the GNU Lesser General Public License as published by
//   the Free Software Foundation, either version 3 of the License, or
//   (at your option) any later version.
//
//   starLiGHT.Noise is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU Lesser General Public License for more details.
//
//   You should have received a copy of the GNU Lesser General Public License
//   along with starLiGHT.Noise. If not, see http://www.gnu.org/licenses/.
//    
//   ADDITIONAL (commercial) LICENSES for starLiGHT.Noise are available on request.
// </license>
// <version>
// **************[ starLiGHT.Engine SVN ]**********************
// * $Rev:: 11290                 $:  Revision of last commit *
// * $Author:: unknown            $:  Author of last commit   *
// * $Date:: 2011-08-29 12:13:46 #$:  Date of last commit     *
// ************************************************************
// </version>
//--------------------------------------------------------------------------------
#endregion

namespace starLiGHT.Noise.Noise
{
    #region Using Statements
    using System;
    using System.Collections.Generic;
    using System.Text;

    #endregion

    public class interp
    {
        /// @addtogroup libnoise
        /// @{

        /// Performs cubic interpolation between two values bound between two other
        /// values.
        ///
        /// @param n0 The value before the first value.
        /// @param n1 The first value.
        /// @param n2 The second value.
        /// @param n3 The value after the second value.
        /// @param a The alpha value.
        ///
        /// @returns The interpolated value.
        ///
        /// The alpha value should range from 0.0 to 1.0.  If the alpha value is
        /// 0.0, this function returns @a n1.  If the alpha value is 1.0, this
        /// function returns @a n2.
        public static double CubicInterp(double n0, double n1, double n2, double n3, double a)
        {
            double p = (n3 - n2) - (n0 - n1);
            double q = (n0 - n1) - p;
            double r = n2 - n0;
            double s = n1;
            return (p * a * a * a) + (q * a * a) + (r * a) + s;
        }

        /// Performs linear interpolation between two values.
        ///
        /// @param n0 The first value.
        /// @param n1 The second value.
        /// @param a The alpha value.
        ///
        /// @returns The interpolated value.
        ///
        /// The alpha value should range from 0.0 to 1.0.  If the alpha value is
        /// 0.0, this function returns @a n0.  If the alpha value is 1.0, this
        /// function returns @a n1.
        public static double LinearInterp(double n0, double n1, double a)
        {
            return ((1.0 - a) * n0) + (a * n1);
        }

        /// Maps a value onto a cubic S-curve.
        ///
        /// @param a The value to map onto a cubic S-curve.
        ///
        /// @returns The mapped value.
        ///
        /// @a a should range from 0.0 to 1.0.
        ///
        /// The derivitive of a cubic S-curve is zero at @a a = 0.0 and @a a =
        /// 1.0
        public static double SCurve3(double a)
        {
            return a * a * (3.0 - 2.0 * a);
        }

        /// Maps a value onto a quintic S-curve.
        ///
        /// @param a The value to map onto a quintic S-curve.
        ///
        /// @returns The mapped value.
        ///
        /// @a a should range from 0.0 to 1.0.
        ///
        /// The first derivitive of a quintic S-curve is zero at @a a = 0.0 and
        /// @a a = 1.0
        ///
        /// The second derivitive of a quintic S-curve is zero at @a a = 0.0 and
        /// @a a = 1.0
        public static double SCurve5(double a)
        {
            double a3 = a * a * a;
            double a4 = a3 * a;
            double a5 = a4 * a;
            return (6.0 * a5) - (15.0 * a4) + (10.0 * a3);
        }
    }
}

